<?php
	require_once(dirname(__FILE__)."/config/include.php");
			
	$time = date("Ymd H:i:s") ;
	
	$_PARA 	= array() ;
	if(array_key_exists('notify_type',$_POST))	$_PARA 		= $_POST ;
	else										$_PARA 		= $_GET ;
	ob_start();
	
	$msg = "" ;
	foreach ($_PARA as $k=>$tmp){
		$msg .= "$k = ".$_PARA[$k]."\r\n" ; 
	}
	file_put_contents(dirname(__FILE__)."/log_pay_zfb.txt","$time -- $msg.\r\n",FILE_APPEND);
		
	sql_connect() ;
	
	if ($_PARA['trade_status'] == "WAIT_BUYER_PAY"){
		message_log_zfb("WAIT_BUYER_PAY : 交易预生成") ;
		
		$out_trade_no = $_PARA['out_trade_no'] ;		// 商户订单号	
		$trade_no = $_PARA['trade_no'] ;				// 支付宝订单号
				
		// 检测是否多次支付的订单号
		$trarr = explode("_" , $out_trade_no);
		$out_trade_no_count = 0 ;		// 支付次数		
		if (is_array($trarr) && count($trarr) >= 2){
			$out_trade_no = $trarr[0] ;
			$out_trade_no_count = $trarr[1] ;
		}
		$uid = intval(sql_fetch_one_cell("select `user_id` from `pay_trade` where `trade_no` = '$out_trade_no'")) ;
		if ($uid <= 0){
			// 非法订单,直接返回
			zfb_return("非法订单,没处理返回.") ;
		}
		
		$total_fee = doubleval($_PARA['total_fee']) ;		// 交易金额
        if ($total_fee == 0)    $total_fee = doubleval($_PARA['total_amount']) ;
		$price 	=  doubleval($_PARA['price']) ;				// 商品单价
        if ($price == 0)        $price = "实收金额 : " .  $_PARA['receipt_amount'] ;
		if (count($trarr) >= 4)
		{
			$total_fee = $trarr[3] / 100 ;
		}
		
		$newmemo = json_encode($_PARA,JSON_UNESCAPED_UNICODE);		
		$prepay_id = "zfb_$trade_no" ;
		if (create_pay_beforehand_order($uid , $prepay_id , 2 , $out_trade_no , $out_trade_no_count , $newmemo , $total_fee) == false){
			zfb_return("交易创建失败.可能数据库语句执行失败,等待支付宝下次调用回调" , false) ;	
		}		
		zfb_return("处理成功,成功预先创建交易日志") ;
	}
	
	if ($_PARA['trade_status'] == "TRADE_SUCCESS"){
		message_log_zfb("TRADE_SUCCESS : 交易成功") ;
		
		// 支付成功
		$out_trade_no = $_PARA['out_trade_no'] ;		// 商户订单号	
		$trade_no = $_PARA['trade_no'] ;				// 支付宝订单号
		
		$is_create_logistics = true ;	// 是否处理物流表
		$out_trade_no_count = 0 ;
		
		// 检测是否多次支付的订单号
		$trarr = explode("_" , $out_trade_no);
		$out_trade_no_count = 0 ;		// 支付次数		
		if (is_array($trarr) && count($trarr) >= 2){
			$out_trade_no = $trarr[0] ;
			$out_trade_no_count = $trarr[1] ;
		}
		$uid = intval(sql_fetch_one_cell("select `user_id` from `pay_trade` where `trade_no` = '$out_trade_no'")) ;
		if ($uid <= 0){
			// 非法订单,直接返回
			zfb_return("非法订单,没处理返回.") ;
		}
		$total_fee = doubleval($_PARA['total_fee']) ;		// 交易金额
        if ($total_fee == 0)    $total_fee = doubleval($_PARA['total_amount']) ;
		$price 	=  doubleval($_PARA['price']) ;				// 商品单价
        if ($price == 0)        $price = "实收金额 : " .  $_PARA['receipt_amount'] ;
		if (count($trarr) >= 4)
		{
			$total_fee = $trarr[3] / 100 ;
		}

		// 判定订单是否正确
		$log_pay = sql_fetch_one("select * from log_pay where `trade_no` = '$out_trade_no' and `trade_no_count` = '$out_trade_no_count' ") ;
		if (!is_array($log_pay) || !array_key_exists("trade_no", $log_pay)){
			message_log_zfb("订单不存在,创建订单,预生成订单为到达,先处理") ;
			
			$newmemo = json_encode($_PARA,JSON_UNESCAPED_UNICODE);		
			$prepay_id = "zfb_$trade_no" ;
			if (create_pay_beforehand_order($uid , $prepay_id , 2 , $out_trade_no , $out_trade_no_count , $newmemo , $total_fee) == false){
				zfb_return("交易创建失败.可能数据库语句执行失败,等待支付宝下次调用回调" , false) ;	
			}
			message_log_zfb("处理成功,成功预先创建交易日志") ;

			$log_pay = sql_fetch_one("select * from log_pay where `trade_no` = '$out_trade_no' and `trade_no_count` = '$out_trade_no_count' ") ;
			if (!is_array($log_pay) || !array_key_exists("trade_no", $log_pay)){
				zfb_return("订单号插入失败,请查询" , false) ;
			}
		}
		if ($out_trade_no != $log_pay['trade_no'])
		{
			zfb_return("订单号不正确" , false) ;
		}

		// 多次支付只有第一次创建物流表
		if ($out_trade_no_count > 1){
			$is_create_logistics = false ;
		}
		
		
		$buyer_id = trim($_PARA['buyer_id']);				// 买家支付宝用户号
		$r_data = "支付宝订单号:$trade_no , 总金额:$total_fee 元 , 单价:$price 元, 支付用户支付宝用户号:$buyer_id" ;
		$_PARA['MemoText'] = $r_data ;
		$newmemo = json_encode($_PARA,JSON_UNESCAPED_UNICODE);	//json_encode($_PARA) ;
			
		$prepay_id = "zfb_$trade_no" ;
		
		sql_query("update log_pay set `state` = '1' , `memo_xml` = '$newmemo' where `prepay_id` = '$prepay_id' and `state` = 0") ;
		$log_pay = sql_fetch_one("select * from log_pay where `prepay_id` = '$prepay_id' and `state` = 1") ;
		if (!is_array($log_pay) || !array_key_exists("trade_no", $log_pay)){
			zfb_return("订单已处理") ;
		}
		
		// 根据订单情况生成物流表数据.
		if ($is_create_logistics == true){
			// 多次支付只有第一次创建物流表
			create_logistics_for_trade($out_trade_no) ;
		}
		sql_query("update log_pay set `state` = '2' , `state_count` = `state_count` + 1 , `endtime` = unix_timestamp() where `prepay_id` = '$prepay_id'") ;
		
				
		$price_now = 0 ;		// 已经支付的金额
		$trade_count = 0 ;		// 已经支付的次数
		$alltrade = sql_fetch_rows("select * from `log_pay` where `trade_no` = '$out_trade_no' and `state` in (1 , 2)") ;
		if (is_array($alltrade)){
			foreach($alltrade as $at)
			{
				$price_now += doubleval($at['rmb']) ;
				$trade_count += 1 ;
			}
		}
		
		$uid = $log_pay['uid'] ;
		$one_trade = sql_fetch_one("select * from pay_trade where `trade_no` = '$out_trade_no' and `user_id` = '$uid'") ;
		$price_modify = doubleval($one_trade['price_modify']) ;
		
		
		if ($price_modify != $price_now){
			// 已经支付的和总支付的不相等 -- 多次支付,首次支付,修改支付状态为支付部分 , 订单状态为支付状态.
			if ($out_trade_no_count <= 0){
				sql_query("update `pay_trade` set `price_state` = 1 , `trade_state` = 1 where `trade_no` = '$out_trade_no'") ;
			}elseif ($out_trade_no_count <= 1){
				sql_query("update `pay_trade` set `price_state` = 11 , `trade_state` = 1 where `trade_no` = '$out_trade_no'") ;
			}
		}else{
			// 已经支付 = 总支付, 支付完成
			sql_query("update `pay_trade` set `price_state` = 1 where `trade_no` = '$out_trade_no'") ;
			sql_query("update `pay_trade` set `trade_state` = 1 where `trade_no` = '$out_trade_no' and `trade_state` = 0") ;
		}
		send_user_pay_money_SMS($out_trade_no , $uid , $total_fee ) ;

		zfb_return("订单已处理 , 交易成功.") ;
	}
	if ($_PARA['trade_status'] == "TRADE_CLOSED")
	{
		message_log_zfb("TRADE_CLOSED : 交易关闭") ;
		
		// 交易关闭
		$out_trade_no = $_PARA['out_trade_no'] ;		// 商户订单号	
		$trade_no = $_PARA['trade_no'] ;				// 支付宝订单号

		$out_trade_no_count = 0 ;
		
		// 检测是否多次支付的订单号
		$trarr = explode("_" , $out_trade_no);
		$out_trade_no_count = 0 ;		// 支付次数		
		if (is_array($trarr) && count($trarr) >= 2){
			$out_trade_no = $trarr[0] ;
			$out_trade_no_count = $trarr[1] ;
		}
		$uid = intval(sql_fetch_one_cell("select `user_id` from `pay_trade` where `trade_no` = '$out_trade_no'")) ;
		if ($uid <= 0){
			// 非法订单,直接返回
			zfb_return("非法订单,没处理返回.") ;
		}
		
		$prepay_id = "zfb_$trade_no" ;
		
		sql_query("update log_pay set `state` = '99' where `prepay_id` = '$prepay_id'") ;
		sql_query("update `pay_trade` set `trade_state` = 2 ,  `price_state` = 3  where `trade_no` = '$out_trade_no'") ;		
		zfb_return("订单已处理 , 交易关闭成功.") ;
	}
	
	zfb_return("其他类型回调通知,暂不处理......") ;
	
	
	function message_log_zfb($message)
	{
		$time = date("Ymd H:i:s") ;
		file_put_contents(dirname(__FILE__)."/log_pay_zfb.txt","---------$time ----- $message.\r\n\r\n",FILE_APPEND);
	}
	
	function zfb_return($message , $rntzfb = true)
	{
		if ($rntzfb == true){
			ob_end_clean();
			$show = "success" ;
		    echo $show ;    
			ob_end_flush();
		}
		
		$time = date("Ymd H:i:s") ;
		file_put_contents(dirname(__FILE__)."/log_pay_zfb.txt","$time -- $message.\r\n",FILE_APPEND);
		exit(0) ;
	}
	
?>